# Carga de librerías necesarias
library(DiagrammeR)
library(kableExtra)
library(ahp)
# Carga de funciones multicriterio
source("funciones_clase/teoriadecision_funciones_multicriterio.R")
source("funciones_clase/teoriadecision_funciones_multicriterio_diagram.R")
source("funciones_clase/teoriadecision_funciones_multicriterio_utiles.R")
# Carga otras funciones
source("funciones_propias/otras_funciones.R")
source("funciones_propias/tablas_planteamiento_AHP.R")
source("funciones_propias/animación_grafo.R")Adquisición de un monitor de PC mediante métodos multicriterio
Presentación del problema
El objetivo de este documento será elegir la mejor alternativa a la hora de adquirir un nuevo monitor de PC. Se va a considerar que el individuo interesado en esta adquisición es un arquitecto que necesita un nuevo monitor para su estudio.
Se van a seleccionar 5 monitores diferentes, que tratan de representar una variedad de opciones en el mercado actual. Los criterios que se van a considerar son los siguientes:
- Precio (€)
- Tamaño (pulgadas)
- Frecuencia de actualización (Hz) o de refresco.
- Resolución (px)
- Consumo energético (W) en un instante.
- Densidad de píxeles (ppi)
- Brillo (nits)
- Contraste (en millones de colores M)
Y las alternativas, con sus correspondientes características, las podemos ver en la siguiente tabla:
datos <- read.csv2("datos/monitores.csv", header = FALSE, sep = ";")
colnames(datos) <- c("Modelo","Precio", "Tamaño", "Frecuencia", "Resolución", "Consumo", "Densidad", "Brillo", "Colores")
crea_tabla_estilo(datos, nombresfila = FALSE)| Modelo | Precio | Tamaño | Frecuencia | Resolución | Consumo | Densidad | Brillo | Colores |
|---|---|---|---|---|---|---|---|---|
| LG UltraFine 40WT95UF | 505 | 39.7 | 120 | 2160 | 40 | 139 | 450 | 1060 |
| Asus TUF Gaming VG27AQ3A | 244 | 27 | 180 | 1440 | 35 | 108 | 250 | 16.7 |
| MSI MAG401QR | 449 | 40 | 155 | 1440 | 39 | 93 | 400 | 1070 |
| Asus VZ27EHF | 108 | 27 | 100 | 1080 | 21 | 81 | 250 | 16.7 |
| Samsung UJ59 | 290 | 31.5 | 60 | 2160 | 37 | 139 | 270 | 1000 |
ruta_imagenes <- c("datos/monitores/a1.png",
"datos/monitores/a2.png",
"datos/monitores/a3.png",
"datos/monitores/a4.png",
"datos/monitores/a5.png")
data.frame(Modelo = datos[1],
Imágen = rep("", 5),
check.names = FALSE) |>
kbl(booktabs = T, align = "c") |>
kable_paper(full_width = T) |>
column_spec(2, image = spec_image(ruta_imagenes, 280, 200)) |>
row_spec(0, bold = TRUE, background = "#F8A29E")| Modelo | Imágen |
|---|---|
| LG UltraFine 40WT95UF | |
| Asus TUF Gaming VG27AQ3A | |
| MSI MAG401QR | |
| Asus VZ27EHF | |
| Samsung UJ59 |
Este arquitecto busca un monitor que le permita trabajar con planos y renderizados de alta calidad. El precio le preocupa en poca medida, pero quiere un monitor que ofrezca buena resolución y una buena representación de colores. Además, valora un tamaño grande para facilitar su trabajo. En cuanto al consumo, quiere que sea lo más bajo posible, pero no lo valora especialmente.
Elegir un método
Planteamiento para el método AHP
Introducción
Para el método AHP, se va a dar una estructura jerárquica de criterios y subcriterios. Se van a considerar tres criterios: Coste, calidad de imagen y experiencia de usuario.
El criterio coste, incluye los subcriterios: precio y consumo energético.
El criterio calidad de imagen, incluye los subcriterios: resolución, densidad, brillo y colores.
El criterio experiencia de usuario, incluye los subcriterios: tamaño y frecuencia de actualización.
Vemos a continuación un diagrama que representa esta jerarquía:
DiagrammeR::grViz("
digraph {
node [shape = rectangle, style = 'rounded,filled', fontname = 'Source Sans Pro', fontsize = '12']
A [label = 'Elección de un monitor', fillcolor = '#C7645D']
B [label = 'Coste', fillcolor = '#E2807A']
C [label = 'Calidad de Imagen', fillcolor = '#E2807A']
D [label = 'Experiencia de Usuario', fillcolor = '#E2807A']
E [label = 'Precio', fillcolor = '#F8A29E']
F [label = 'Consumo', fillcolor = '#F8A29E']
G [label = 'Resolución', fillcolor = '#F8A29E']
H [label = 'Densidad', fillcolor = '#F8A29E']
I [label = 'Brillo', fillcolor = '#F8A29E']
J [label = 'Colores', fillcolor = '#F8A29E']
K [label = 'Tamaño', fillcolor = '#F8A29E']
L [label = 'Frecuencia', fillcolor = '#F8A29E']
edge[color = '#005A89', arrowsize = '0.5']
A -> {B C D}
B -> {E F}
C -> {G H I J}
D -> {K L}
}")Matrices de comparación por parejas
A continuación se establecen las siguientes matrices de comparación por parejas para los criterios, subcriterios y alternativas. Se ha realizado en un script anexo llamado “tablas_planteamiento_AHP.R” para una mejor legibilidad.
Nivel 1 - Criterios
En cuanto a los criterios, atendiendo a las indicaciones dadas por el arquitecto, se ha establecido la siquiente matriz de comparaciones dos a dos.
| Coste | Calidad de Imagen | Experiencia de Usuario | |
|---|---|---|---|
| Coste | 1 | 1/7 | 1/5 |
| Calidad de Imagen | 7 | 1 | 3 |
| Experiencia de Usuario | 5 | 1/3 | 1 |
Se ha valorado la calidad de imagen como de importancia muy fuerte sobre el precio y moderada sobre la experiencia de usuario, además de importancia fuerte de la experiencia de usuario sobre el precio. De esta forma relegamos el precio como criterio de menor importancia, lejos de la calidad de imagen (en primer lugar) y de la experiencia de usuario (segundo lugar).
Nivel 2 - Subcriterios:
Coste:
Los subcriterios dentro del coste eran precio y consumo, vemos su comparación dos a dos en esta tabla.
| Precio | Consumo | |
|---|---|---|
| Precio | 1 | 5 |
| Consumo | 1/5 | 1 |
Se considera que el precio es fuertemente más relevante que el consumo, pues el arquitecto tendría que pasar muchos años sin renovar este monitor para que el consumo tenga incidencia real en el coste del monitor.
Calidad de Imagen:
Los subcriterios que conforman la calidad de imagen son comparados dos a dos en la siguiente tabla.
| Resolución | Densidad | Brillo | Colores | |
|---|---|---|---|---|
| Resolución | 1 | 2 | 7 | 5 |
| Densidad | 1/2 | 1 | 5 | 3 |
| Brillo | 1/7 | 1/5 | 1 | 1/3 |
| Colores | 1/5 | 1/3 | 3 | 1 |
La resolución y la densidad son dos parámetros prácticamente de igual importancia, definen la calidad de un monitor conjuntamente, pero queremos que la resolución tenga una incidencia levemente superior en el resultado final. Por ello ambos subcriterios son más fuertes en relevancia que los otros dos, ajustándose los valores sobre los otros criterios a esta sutil diferencia entre resolución y densidad de píxeles. Por su parte, la cantidad de colores será algo más relevante que el brillo y le hemos dado una imporancia moderada sobre este.
Experiencia de Usuario:
La siguiente tabla muestra los subcriterios de la experiencia de usuario, tamaño y frecuencia de actualización.
| Tamaño | Frecuencia | |
|---|---|---|
| Tamaño | 1 | 3 |
| Frecuencia | 1/3 | 1 |
La importancia del tamaño sobre la frecuencia de actualización es moderada, el arquitecto pasa muchas horas delante del ordenador y la necesidad de una buena frecuencia, que ayude a un menor cansancio visual, es de casi la misma relevancia que un buen tamaño para el trabajo multitarea.
Nivel 3 - Alternativas:
A continuación, se comparan las alternativas para todos los subcriterios. Se añade un pequeño comentario acerca del criterio seguido.
Precio:
Se ha intentado dar la relevancia de los precios acorde a las diferencias de precio entre los monitores, de esta forma las alternativas más caras tienen relevancia casi idéntica entre si, la opción más económica oscila entre preferencias fuertes y extremas con el resto de monitores. Y las opciones intermedias oscilan entre preferencias moderadas y muy fuertes sobre las alternativas más caras.
| LG UltraFine 40WT95UF | Asus TUF Gaming VG27AQ3A | MSI MAG401QR | Asus VZ27EHF | Samsung UJ59 | |
|---|---|---|---|---|---|
| LG UltraFine 40WT95UF | 1 | 1/7 | 1/2 | 1/9 | 1/5 |
| Asus TUF Gaming VG27AQ3A | 7 | 1 | 5 | 1/4 | 3 |
| MSI MAG401QR | 2 | 1/5 | 1 | 1/7 | 1/4 |
| Asus VZ27EHF | 9 | 4 | 7 | 1 | 5 |
| Samsung UJ59 | 5 | 1/3 | 4 | 1/5 | 1 |
Consumo:
En cuanto al consumo, una opción destaca sobre las demás. Con 21W frente a 35W de la siguiente alternativa en menor consumo. Por ello su preferencia va desde muy fuerte hasta extrema sobre el resto de opciones. El resto de alternativas con consumos muy similares tienen preferencias entre muy moderadas y casi fuertes.
| LG UltraFine 40WT95UF | Asus TUF Gaming VG27AQ3A | MSI MAG401QR | Asus VZ27EHF | Samsung UJ59 | |
|---|---|---|---|---|---|
| LG UltraFine 40WT95UF | 1 | 1/4 | 1/2 | 1/9 | 1/3 |
| Asus TUF Gaming VG27AQ3A | 4 | 1 | 3 | 1/6 | 2 |
| MSI MAG401QR | 2 | 1/3 | 1 | 1/8 | 3 |
| Asus VZ27EHF | 9 | 6 | 8 | 1 | 7 |
| Samsung UJ59 | 3 | 1/2 | 1/3 | 1/7 | 1 |
Resolución:
En la resolución tenemos 3 grupos, y todas las preferencias son las mismas para las alternativas en cada grupo. Las de resolución más alta tienen preferencia extrema sobre la de resolución más baja y fuerte sobre las de resolución media. Mientras, las de resolución media tienen preferencia moderada sobre las de resolución baja.
| LG UltraFine 40WT95UF | Asus TUF Gaming VG27AQ3A | MSI MAG401QR | Asus VZ27EHF | Samsung UJ59 | |
|---|---|---|---|---|---|
| LG UltraFine 40WT95UF | 1 | 5 | 5 | 9 | 1 |
| Asus TUF Gaming VG27AQ3A | 1/5 | 1 | 1 | 3 | 1/5 |
| MSI MAG401QR | 1/5 | 1 | 1 | 3 | 1/5 |
| Asus VZ27EHF | 1/9 | 1/3 | 1/3 | 1 | 1/9 |
| Samsung UJ59 | 1 | 5 | 5 | 9 | 1 |
Densidad:
Para la densidad se ha intentado asignar la preferencia según los ppi de cada monitor, cuanto mayor es esta cifra sobre la de la alternativa a comparar, más fuerte será la preferencia sobre ella.
| LG UltraFine 40WT95UF | Asus TUF Gaming VG27AQ3A | MSI MAG401QR | Asus VZ27EHF | Samsung UJ59 | |
|---|---|---|---|---|---|
| LG UltraFine 40WT95UF | 1 | 3 | 5 | 7 | 1 |
| Asus TUF Gaming VG27AQ3A | 1/3 | 1 | 3 | 5 | 1/3 |
| MSI MAG401QR | 1/5 | 1/3 | 1 | 3 | 1/5 |
| Asus VZ27EHF | 1/7 | 1/5 | 1/3 | 1 | 1/7 |
| Samsung UJ59 | 1 | 3 | 5 | 7 | 1 |
Brillo:
Para el brillo se ha optado por un criterio similar al de la resolución.
| LG UltraFine 40WT95UF | Asus TUF Gaming VG27AQ3A | MSI MAG401QR | Asus VZ27EHF | Samsung UJ59 | |
|---|---|---|---|---|---|
| LG UltraFine 40WT95UF | 1 | 7 | 2 | 7 | 6 |
| Asus TUF Gaming VG27AQ3A | 1/7 | 1 | 1/3 | 1 | 2 |
| MSI MAG401QR | 1/2 | 6 | 1 | 6 | 5 |
| Asus VZ27EHF | 1/7 | 1 | 3 | 1 | 2 |
| Samsung UJ59 | 1/6 | 1/2 | 1/5 | 1/2 | 1 |
Colores:
En cuanto a la comparación dos a dos de la cantidad de colores (millones), se han hecho dos grupos. Los que tienen +1000 colores y los que tienen 16.7, así los del primer grupo tendrán una preferencia muy fuerte sobre los del segundo.
| LG UltraFine 40WT95UF | Asus TUF Gaming VG27AQ3A | MSI MAG401QR | Asus VZ27EHF | Samsung UJ59 | |
|---|---|---|---|---|---|
| LG UltraFine 40WT95UF | 1 | 7 | 1 | 7 | 1 |
| Asus TUF Gaming VG27AQ3A | 1/7 | 1 | 1/7 | 1 | 1/7 |
| MSI MAG401QR | 1 | 7 | 1 | 7 | 1 |
| Asus VZ27EHF | 1/7 | 1 | 1/7 | 1 | 1/7 |
| Samsung UJ59 | 1 | 7 | 1 | 7 | 1 |
Tamaño:
Criterio similar al de la resolución, pantallas en torno a las 40” preferencias muy fuertes sobre las de 27” y fuertes sobre la de 31.5”. Pantalla de 31.5” preferencia moderada sobre las de 27”.
| LG UltraFine 40WT95UF | Asus TUF Gaming VG27AQ3A | MSI MAG401QR | Asus VZ27EHF | Samsung UJ59 | |
|---|---|---|---|---|---|
| LG UltraFine 40WT95UF | 1 | 7 | 1 | 7 | 5 |
| Asus TUF Gaming VG27AQ3A | 1/7 | 1 | 1/7 | 1 | 1/3 |
| MSI MAG401QR | 1 | 7 | 1 | 7 | 5 |
| Asus VZ27EHF | 1/7 | 1 | 1/7 | 1 | 1/3 |
| Samsung UJ59 | 1/5 | 3 | 1/5 | 3 | 1 |
Frecuencia:
Criterio similar al del precio, dando la preferencia según el valor de la frecuencia de cada monitor.
| LG UltraFine 40WT95UF | Asus TUF Gaming VG27AQ3A | MSI MAG401QR | Asus VZ27EHF | Samsung UJ59 | |
|---|---|---|---|---|---|
| LG UltraFine 40WT95UF | 1 | 1/5 | 1/3 | 5 | 7 |
| Asus TUF Gaming VG27AQ3A | 5 | 1 | 3 | 7 | 9 |
| MSI MAG401QR | 3 | 1/3 | 1 | 6 | 8 |
| Asus VZ27EHF | 1/5 | 1/7 | 1/6 | 1 | 3 |
| Samsung UJ59 | 1/7 | 1/9 | 1/8 | 1/3 | 1 |
Desarrollo del problema
AHP con R
Introducción de las matrices en R
En primer lugar vamos a introducir las matrices de comparación por parejas para emplear las funciones de clase. Se ha utilizado además la función multicriterio.metodoAHP.chequeo.matrizcomparaciones para asegurar que las matrices son válidas.
## CRITERIOS
matriz_criterios_ahp <- multicriterio.crea.matrizvaloraciones_mej(
c(1/7,1/5,3), numalternativas = 3, v.nombres.alternativas = c(
"Coste", "Calidad de Imagen", "Experiencia de Usuario"))
## SUBCRITERIOS
#Coste
matriz_subcriterio_coste_ahp <- multicriterio.crea.matrizvaloraciones_mej(
c(5), numalternativas = 2, v.nombres.alternativas = c("Precio", "Consumo"))
#Calidad de imagen
matriz_subcriterio_calidad_ahp <- multicriterio.crea.matrizvaloraciones_mej(
c(2,7,5,5,3,1/3), numalternativas = 4, v.nombres.alternativas = c(
"Resolución", "Densidad", "Brillo", "Colores"))
#Experiencia de usuario
matriz_subcriterio_experiencia_ahp <- multicriterio.crea.matrizvaloraciones_mej(
c(3), numalternativas = 2, v.nombres.alternativas = c("Tamaño", "Frecuencia"))
## ALTERNATIVAS
#Precio
matriz_alternativas_precio_ahp <- multicriterio.crea.matrizvaloraciones_mej(
c(1/7,1/2,1/9,1/5,5,1/4,3,1/7,1/4,5), numalternativas = 5, v.nombres.alternativas = datos$Modelo)
#Consumo
matriz_alternativas_consumo_ahp <- multicriterio.crea.matrizvaloraciones_mej(
c(1/4,1/2,1/9,1/3,3,1/6,2,1/8,3,7), numalternativas = 5, v.nombres.alternativas = datos$Modelo)
#Resolución
matriz_alternativas_resolucion_ahp <- multicriterio.crea.matrizvaloraciones_mej(
c(5,5,9,1,1,3,1/5,3,1/5,1/9), numalternativas = 5, v.nombres.alternativas = datos$Modelo)
#Densidad
matriz_alternativas_densidad_ahp <- multicriterio.crea.matrizvaloraciones_mej(
c(3,5,7,1,3,5,1/3,3,1/5,1/7), numalternativas = 5, v.nombres.alternativas = datos$Modelo)
#Brillo
matriz_alternativas_brillo_ahp <- multicriterio.crea.matrizvaloraciones_mej(
c(7,2,7,6,1/3,1,2,6,5,2), numalternativas = 5, v.nombres.alternativas = datos$Modelo)
#Colores
matriz_alternativas_colores_ahp <- multicriterio.crea.matrizvaloraciones_mej(
c(7,1,7,1,1/7,1,1/7,7,1,1/7), numalternativas = 5, v.nombres.alternativas = datos$Modelo)
#Tamaño
matriz_alternativas_tamaño_ahp <- multicriterio.crea.matrizvaloraciones_mej(
c(7,1,7,5,1/7,1,1/3,7,5,1/3), numalternativas = 5, v.nombres.alternativas = datos$Modelo)
# Frecuencia
matriz_alternativas_frecuencia_ahp <- multicriterio.crea.matrizvaloraciones_mej(
c(1/5,1/3,5,7,3,7,9,6,8,3), numalternativas = 5, v.nombres.alternativas = datos$Modelo)## Intento trabajar con listas para reducir el código
lista_matrices_parejas <- list(matriz_criterios_ahp,
matriz_subcriterio_coste_ahp,
matriz_subcriterio_calidad_ahp,
matriz_subcriterio_experiencia_ahp,
matriz_alternativas_precio_ahp,
matriz_alternativas_consumo_ahp,
matriz_alternativas_resolucion_ahp,
matriz_alternativas_densidad_ahp,
matriz_alternativas_brillo_ahp,
matriz_alternativas_colores_ahp,
matriz_alternativas_tamaño_ahp,
matriz_alternativas_frecuencia_ahp)
## Le ponemos nombres para facilitar su localización
nombres_matrices <- c("Criterios", "Coste", "Calidad", "Experiencia",
"Precio", "Consumo", "Resolución", "Densidad",
"Brillo", "Colores", "Tamaño", "Frecuencia")
names(lista_matrices_parejas) <- nombres_matrices
## Ahora a todas las matrices de esta lista le aplicamos la función de inconsistencia
lista_inconsistencias <- lapply(lista_matrices_parejas, multicriterio.metodoAHP.coef.inconsistencia)
## Ahora a todas las matrices de la lista de matrices por parejas le aplicamos la función para calcular pesos
lista_pesos <- lapply(lista_matrices_parejas, multicriterio.metodoAHP.variante2.mediageometrica)Inconsistencia
Se ha realizado una tabla que recoge el análisis de inconsistencia de todas las matrices empleadas en el método AHP. Además se incluye una columna que recoge la validación de la matriz para su uso en el método AHP.
## Al usar el método con listas, la hemos calculado también para matrices 2x2 sin ser necesario.
# Esta función, permite redondear RI de aquellos que queremos calcular y sustituye NaN por "-"
# para mostrarlo en la tabla.
convertir_vector_valores_listaNaN <- function (x) {
if(is.nan(x$RI.coef.inconsistencia)){
inter <- "-"
} else {
inter <- round(x$RI.coef.inconsistencia,4)
}
return(inter)
}
tabla_inconsistencia_ahp <- data.frame(
Matriz = c(
"Criterios",
"Subcriterio Coste",
"Subcriterio Calidad de Imagen",
"Subcriterio Experiencia de Usuario",
"Alternativa Precio",
"Alternativa Consumo",
"Alternativa Resolución",
"Alternativa Densidad",
"Alternativa Brillo",
"Alternativa Colores",
"Alternativa Tamaño",
"Alternativa Frecuencia"
),
`RI Coeficiente inconsistencia` = sapply(lista_inconsistencias, convertir_vector_valores_listaNaN),
Estado = sapply(lista_inconsistencias, function(x) x$mensaje),
`Matriz aceptable` = sapply(lista_matrices_parejas, multicriterio.metodoAHP.chequeo.matrizcomparaciones))
crea_tabla_estilo(tabla_inconsistencia_ahp, nombresfila = FALSE)| Matriz | RI.Coeficiente.inconsistencia | Estado | Matriz.aceptable |
|---|---|---|---|
| Criterios | 0.0559 | Consistencia aceptable | TRUE |
| Subcriterio Coste | Consistencia aceptable | TRUE | |
| Subcriterio Calidad de Imagen | 0.0254 | Consistencia aceptable | TRUE |
| Subcriterio Experiencia de Usuario | Consistencia aceptable | TRUE | |
| Alternativa Precio | 0.0658 | Consistencia aceptable | TRUE |
| Alternativa Consumo | 0.0869 | Consistencia aceptable | TRUE |
| Alternativa Resolución | 0.0094 | Consistencia aceptable | TRUE |
| Alternativa Densidad | 0.0304 | Consistencia aceptable | TRUE |
| Alternativa Brillo | 0.0298 | Consistencia aceptable | TRUE |
| Alternativa Colores | 0 | Consistencia aceptable | TRUE |
| Alternativa Tamaño | 0.021 | Consistencia aceptable | TRUE |
| Alternativa Frecuencia | 0.0859 | Consistencia aceptable | TRUE |
Si alguna de las matrices de comparación hubiese dado un coeficiente de inconsistencia mayor a 0.1, tendríamos que haber revisado la matriz en cuestión para asegurarnos de que las relaciones lógicas entre las alternativas se han respetado. En nuestro caso, su realización ha sido meticulosa y la consistencia se ha podido cumplir sin rehacer las tablas.
Cálculo de los pesos
Criterios:
En primer lugar vamos a calcular los pesos finales para el último nivel de criterios y subcriterios, para ello multiplicaremos la valoración de cada criterio por la valoración de cada uno de los subcriterios que lo componen.
# Preparación matriz criterios*subcriterios
c11 <- lista_pesos$Criterios$valoraciones.ahp[1] * lista_pesos$Coste$valoraciones.ahp[1]
c12 <- lista_pesos$Criterios$valoraciones.ahp[1] * lista_pesos$Coste$valoraciones.ahp[2]
c21 <- lista_pesos$Criterios$valoraciones.ahp[2] * lista_pesos$Calidad$valoraciones.ahp[1]
c22 <- lista_pesos$Criterios$valoraciones.ahp[2] * lista_pesos$Calidad$valoraciones.ahp[2]
c23 <- lista_pesos$Criterios$valoraciones.ahp[2] * lista_pesos$Calidad$valoraciones.ahp[3]
c24 <- lista_pesos$Criterios$valoraciones.ahp[2] * lista_pesos$Calidad$valoraciones.ahp[4]
c31 <- lista_pesos$Criterios$valoraciones.ahp[3] * lista_pesos$Experiencia$valoraciones.ahp[1]
c32 <- lista_pesos$Criterios$valoraciones.ahp[3] * lista_pesos$Experiencia$valoraciones.ahp[2]
criterios_subcriterios <- c(c11,c12,c21,c22,c23,c24,c31,c32)
names(criterios_subcriterios) <- nombres_matrices[5:12]Los podemos ver en la siguiente tabla.
tabla_criterios_subcriterios <- crea_tabla_estilo(data.frame(
Criterios = names(criterios_subcriterios),
Peso = criterios_subcriterios
), nombresfila = FALSE)
tabla_criterios_subcriterios| Criterios | Peso |
|---|---|
| Precio | 0.05993952 |
| Consumo | 0.01198790 |
| Resolución | 0.33961705 |
| Densidad | 0.19430335 |
| Brillo | 0.03667901 |
| Colores | 0.07851859 |
| Tamaño | 0.20921592 |
| Frecuencia | 0.06973864 |
Alternativas:
Vamos ahora a calcular los pesos finales para cada alternativa, donde un mayor peso indicará preferencia sobre alternativas con menor ponderación final.
mat_pesos_alternativas <- matrix(c(
sapply(lista_pesos[5:12],function(x) x$valoraciones.ahp)
),
ncol = 5, nrow = 8, byrow = TRUE)
ponderaciones_final <- data.frame((criterios_subcriterios %*% mat_pesos_alternativas))
colnames(ponderaciones_final) <- datos$ModeloTambién los mostramos en una tabla:
tabla_ponderación_final <- crea_tabla_estilo(ponderaciones_final, nombresfila = FALSE)
tabla_ponderación_final| LG UltraFine 40WT95UF | Asus TUF Gaming VG27AQ3A | MSI MAG401QR | Asus VZ27EHF | Samsung UJ59 |
|---|---|---|---|---|
| 0.3428178 | 0.1285062 | 0.1855899 | 0.07897614 | 0.2641099 |
Además se adjunta un grafo, mostrando como evolucionan los pesos en la jerarquía. Los pesos para cada eje se encuentran a su derecha.
DiagrammeR::grViz("
digraph {
node [shape = rectangle, style = 'rounded,filled', fontname = 'sans-serif', fontsize = '12']
A [label = 'Elección de un monitor', fillcolor = '#C7645D']
B [label = 'Coste', fillcolor = '#E2807A']
C [label = 'Calidad de Imagen', fillcolor = '#E2807A']
D [label = 'Experiencia de Usuario', fillcolor = '#E2807A']
E [label = 'Precio', fillcolor = '#F8A29E']
F [label = 'Consumo', fillcolor = '#F8A29E']
G [label = 'Resolución', fillcolor = '#F8A29E']
H [label = 'Densidad', fillcolor = '#F8A29E']
I [label = 'Brillo', fillcolor = '#F8A29E']
J [label = 'Colores', fillcolor = '#F8A29E']
K [label = 'Tamaño', fillcolor = '#F8A29E']
L [label = 'Frecuencia', fillcolor = '#F8A29E']
M [label = 'Alternativas', fillcolor = '#7FBFF5']
N [label = 'LG UltraFine 40WT95UF', fillcolor = '#7FBFF5']
O [label = 'Asus TUF Gaming VG27AQ3A', fillcolor = '#7FBFF5']
P [label = 'MSI MAG401QR', fillcolor = '#7FBFF5']
Q [label = 'Asus VZ27EHF', fillcolor = '#7FBFF5']
R [label = 'Samsung UJ59', fillcolor = '#7FBFF5']
edge[color = '#005A89', arrowsize = '0.5', fontname = 'sans-serif', fontsize = '10']
A -> B [label = ' 0.0719']
A -> C [label = ' 0.6491']
A -> D [label = ' 0.279']
B -> E [label = ' 0.833']
B -> F [label = ' 0.167']
C -> G [label = ' 0.523']
C -> H [label = ' 0.299']
C -> I [label = ' 0.057']
C -> J [label = ' 0.121']
D -> K [label = ' 0.75']
D -> L [label = ' 0.25']
E -> M [label = ' 0.06']
F -> M [label = ' 0.012']
G -> M [label = ' 0.34']
H -> M [label = ' 0.194']
I -> M [label = ' 0.037']
J -> M [label = ' 0.08']
K -> M [label = ' 0.209']
L -> M [label = ' 0.07']
M -> N [label = ' 0.343']
M -> O [label = ' 0.129']
M -> P [label = ' 0.186']
M -> Q [label = ' 0.079']
M -> R [label = ' 0.264']
}")AHP con paquete
Preparación del modelo
En primer lugar tenemos que crear el archivo ahp que almacena el modelo necesario para este paquete, se encuentra en la raíz del proyecto y lo cargamos con ayuda del paquete ahp. Además vamos a calcular las prioridades, pero no vamos a mostrar el modelo en el documento.
modelo_ahp <- ahp::Load("modelo_monitores.ahp")
#Paso 2. Calcular las prioridades
Calculate(modelo_ahp)
# print(modelo_ahp, priority = function(x) x$parent$priority["Total", x$name])Jerarquía de los criterios
Para observar que el modelo se ha introducido correctamente, y para una mejor comprensión nos vamos a apoyar del siguiente grafo, que nos permite observar la jerarquía de los criterios, los subcriterios y las alternativas.
#Paso 3. Visualizar la jerarquía
Visualize(modelo_ahp,
criteriaNodesStyle = list(
style = "filled, rounded",
penwidth = 3,
color = "#C3625B",
fillcolor = "#F8A29E" ,
shape = "box",
fontname = "sans-serif"),
alternativeNodesStyle = list(
style = "filled, rounded",
penwidth = 3,
color = "#005682",
fillcolor = "#7FBFF5" ,
shape = "box",
fontname = "sans-serif"))Análisis
En este último paso vamos a análizar el modelo, para ello vamos a mostrar en dos tablas los resultados para este modelo. También hay una opción en el paquete para mostrar este resultado sin tabla, se ha escogido la opción con tabla por facilitar su lectura e interpretación. Así no mostramos resultados repetidos.
# Tabla "priority"
aa = AnalyzeTable(modelo_ahp,variable = "priority",sort = "orig", weightColor = "#F8A29E", consistencyColor = "#C6AA74", alternativeColor = "#7FBFF5")
formattable::as.htmlwidget(aa)Esta primera tabla muestra en cada fila de los subcriterios el peso que tiene cada alternativa en ese subcriterio, facilita ver con claridad que alternativa se desempeña mejor en cada subcriterio. En la columna “Priority” podemos ver el desglose de los pesos, primero como se reparte la prioridad total entre cada criterio (Coste un 7’2%, Calidad un 64’9% y Experiencia de usuario un 27’9%) y segundo el mismo reparto en cada subcriterio. Es decir, nos muestra el porcentaje de prioridad dentro de cada grupo. Además del cálculo de la inconsistencia en la última columna.
#Tabla pesos
aa = AnalyzeTable(modelo_ahp, sort = "orig", weightColor = "#F8A29E", consistencyColor = "#C6AA74", alternativeColor = "#7FBFF5")
formattable::as.htmlwidget(aa)En esta otra se ven los pesos para cada monitor (ponderaciones finales) en la primera fila, además la fila de cada criterio muestra cuanto del peso total viene dado por este criterio para cada alternativa, de forma que la suma de los porcentajes de cada alternativa en esos criterios es el peso asignado a cada alternativa, y de igual forma para los subcriterios. Así para la alternativa elegida: Peso a1 = 34,2%, Coste (0,3%) + Calidad (24,6%) + Experiencia (9,3%), análogo para los subcriterios, nos permite observar cuanto ha influido cada criterio/subcriterio para el peso final de las alternativas. Esta tabla contiene los resultados que hemos obtenido con las funciones de clase la ya mencionada primera fila y en la columna “Weight” si nos fijamos en las filas de los subcriterios, encontramos los pesos que hemos obtenido para el último nivel de la jerarquía de criterios.
Uso de la aplicación shiny
ahp::RunGUI()Se adjuntan algunas capturas que se han realizado mientras se utilizaba la aplicación shiny para este problema. Los resultados son iguales a los obtenidos en el código aquí expuesto.
Conclusiones AHP
Podemos decir que obtenemos dos conclusiones principales tras el análisis de este problema multicriterio con AHP. Ambos métodos usados (funciones de clase y paquete ahp) deben ofrecer, y ofrecen, los mismos resultados.
La primera es relativa a los pesos que se han asignado a los criterios con los que empezábamos el problema (tras utilizar la jerarquía por niveles). Estos pesos serán válidos para otros métodos de decisión multicriterio y consideramos el método AHP como consistente a la hora de obtener pesos (también) para otros métodos.
La segunda es relativa a las ponderaciones finales de cada una de las alternativas, y esto se traduce en que la mejor alternativa es el modelo “LG Ultrafine 40WT95UF” con un peso del 34’28%. La que será nuestra decisión final. Además la segunda alternativa preferida sería el modelo “Samsung UJ59” con un peso del 26’41%. Esta información la emplearemos para comparar los métodos posteriormente.
Planteamiento para el método ELECTRE
Matriz de decisión
Se establece la matriz de decisión, tenemos que hacer negativos los valores que se van a minimizar. Esta matriz de decisión será empleada en los métodos posteriores.
matriz_decisión <- multicriterio.crea.matrizdecision(
c(-505,-40,2160,139,450,1060,39.7,120,
-244,-35,1440,108,250,16.7,27,180,
-449,-39,1440,93,400,1070,40,155,
-108,-21,1080,81,250,16.7,27,100,
-290,-37,2160,139,270,1000,31.5,60
),
numalternativas = 5,
numcriterios = 8,
v.nombresalt = names(ponderaciones_final),
v.nombrescri = names(criterios_subcriterios)
)Parámetros para el método
Pesos
Como se ha mencionado anteriormente, vamos a emplear los pesos que hemos obtenido tras emplear el método AHP para los criterios y subcriterios.
| Criterios | Peso |
|---|---|
| Precio | 0.05993952 |
| Consumo | 0.01198790 |
| Resolución | 0.33961705 |
| Densidad | 0.19430335 |
| Brillo | 0.03667901 |
| Colores | 0.07851859 |
| Tamaño | 0.20921592 |
| Frecuencia | 0.06973864 |
Test de concordancia
El test de concordancia requiere un valor \(\alpha\) que al ser reducido permite que más alternativas dominen a otras. El valor de \(\alpha\) inicial que vamos a tomar es 0.7.
Test de discordancia
Los valores para \(d_i\) pueden condicionar el resultado, en nuestro caso tenemos pocas alternativas, de características y rangos de precio muy variadas. Que lo hacen muy sensible a estos valores.
- Brillo: Una diferencia mayor de 50 nits en el brillo será suficiente para no pasar el test de discordancia.
- Colores: Se considera que diferencias menores a 100 (millones de colores) son insuficientes para no pasar el test de discordancia.
- Tamaño de pantalla: Una diferencia mayor de 3” hará que no se supere el test de discordancia
A continuación se proponen otros posibles valores para ejemplos con mayor cantidad de alternativas o con modelos de una gama similar.
- Precio: 150€
- Consumo: 15W
- Resolución: 720 px
- Densidad de píxeles: 40 ppi
- Frecuencia de refresco: 60 Hz
Además se considera que estas cantidades deberían ser ajustadas e introducidas en el método acorde a los pesos y las magnitudes. Por ejemplo, si se hubiera dado mayor importancia al precio en los pesos podríamos introducirlo como elemento para no superar el test de discordancia.
Algunas de las cantidades propuestas, como la resolución, serían adecuadas para este problema. La no influencia en el resultado final ha desincentivado su inclusión.
Desarrollo del método ELECTRE
Primera iteración
iteración1_ELECTRE <- multicriterio.metodoELECTRE_I(matriz_decisión,
pesos.criterios = criterios_subcriterios,
nivel.concordancia.minimo.alpha = 0.7,
no.se.compensan = c(Inf,Inf,Inf,Inf,50,100,3,Inf),
que.alternativas = TRUE
)
alternativas_iteración1_ELECTRE <- iteración1_ELECTRE$nucleo_aproxVisualizamos el núcleo aproximado del método
crea_tabla_estilo(data.frame(Núcleo = alternativas_iteración1_ELECTRE))| Núcleo | |
|---|---|
| LG UltraFine 40WT95UF | 1 |
| MSI MAG401QR | 3 |
Vamos a mostrar también una tabla en la que vemos la correspondencia entre número de alternativa y el modelo al que corresponde puesto que habrá algunos resultados que muestren este número.
tabla_alternativas_nombre <- data.frame(Modelo = names(ponderaciones_final),
`Alternativa número` = c(1:5),
check.names = FALSE)
crea_tabla_estilo(tabla_alternativas_nombre, nombresfila = FALSE)| Modelo | Alternativa número |
|---|---|
| LG UltraFine 40WT95UF | 1 |
| Asus TUF Gaming VG27AQ3A | 2 |
| MSI MAG401QR | 3 |
| Asus VZ27EHF | 4 |
| Samsung UJ59 | 5 |
Y a continuación, el grafo.
construir_grafo_animado(iteración1_ELECTRE$relacion.dominante, plantilla = "spring")Vemos que para este valor de \(\alpha\), las mejores alternativas son 1, 3. Observando el grafo, vemos que son las únicas alternativas que no son dominadas por otras, además podríamos concluir que la siguiente mejor opción es a5.
Vamos a reducir el valor de \(\alpha\) y nos vamos a quedar con estas dos alternativas para la segunda iteración.
Segunda iteración
Vamos a mostrar el núcleo y el grafo.
iteración2_ELECTRE <- multicriterio.metodoELECTRE_I(matriz_decisión,
pesos.criterios = criterios_subcriterios,
nivel.concordancia.minimo.alpha = 0.6,
no.se.compensan = c(Inf,Inf,Inf,Inf,50,100,3,Inf),
que.alternativas = c(1,3)
)
alternativas_iteración2_ELECTRE <- iteración2_ELECTRE$nucleo_aprox
crea_tabla_estilo(data.frame(Núcleo = alternativas_iteración2_ELECTRE))| Núcleo | |
|---|---|
| LG UltraFine 40WT95UF | 1 |
| MSI MAG401QR | 2 |
construir_grafo(iteración2_ELECTRE$relacion.dominante, que.alternativas = c(1,3))Se puede observar que para \(\alpha\) = 0.6 no hay dominancia de ninguna de estas alternativas sobre la otra. Vamos a reducir su valor una vez más y volvemos a aplicar el método.
Tercera iteración
Mostramos el núcleo y el grafo una vez más.
iteración3_ELECTRE <- multicriterio.metodoELECTRE_I(matriz_decisión,
pesos.criterios = criterios_subcriterios,
nivel.concordancia.minimo.alpha = 0.55,
no.se.compensan = c(Inf,Inf,Inf,Inf,50,100,3,Inf),
que.alternativas = c(1,3)
)
alternativas_iteración3_ELECTRE <- iteración3_ELECTRE$nucleo_aprox
crea_tabla_estilo(data.frame(Núcleo = alternativas_iteración3_ELECTRE))| Núcleo | |
|---|---|
| LG UltraFine 40WT95UF | 1 |
construir_grafo(iteración3_ELECTRE$relacion.dominante, que.alternativas = c(1,3))Con este valor de \(\alpha\) podemos ver que la alternativa LG UltraFine 40WT95UF domina a la alternativa MSI MAG401QR.
Conclusiones del método ELECTRE
Hemos observado que la mejor alternativa es el monitor “LG UltraFine 40WT95UF”, siendo la segunda mejor alternativa el monitor “MSI MAG401QR”. Este método no nos ha dejado la libertad que querríamos a la hora de comparar las alternativas, como se ha mencionado previamente. Y da como resultado que una alternativa con menos resolución que la máxima quede en tercera posición. Principalmente causado por no poder controlar que algunas características las podamos considerar iguales (por sus pequeñas diferencias) en el test de concordancia. Se recomienda al arquitecto optar por el modelo “LG UltraFine 40WT95UF”.
Planteamiento para el método PROMETHEE
Pesos
Vamos a emplear los pesos calculados en AHP para el último nivel de la jerarquía de criterios y subcriterios.
| Criterios | Peso |
|---|---|
| Precio | 0.05993952 |
| Consumo | 0.01198790 |
| Resolución | 0.33961705 |
| Densidad | 0.19430335 |
| Brillo | 0.03667901 |
| Colores | 0.07851859 |
| Tamaño | 0.20921592 |
| Frecuencia | 0.06973864 |
Funciones de preferencia
Para cada criterio vamos a elegir una función de preferencia según la naturaleza de cada uno, tratando además que proporcionen mayor satisfacción a los requisitos del arquitecto. Recordemos los criterios:
Precio: El precio no está entre los requisitos más importantes, pero queremos que tenga algo de indicencia en la decisión final, querríamos que para cantidades con diferencias pequeñas no exista preferencia alguna. Por ello vamos a tomar un valor de Q= 50€
Consumo: El coste anual que supone una diferencia de 10W trabajando es de 2.4€; Cálculo: 10W = 0.01 kW, 6 horas al día todos los días, 0.01 kW x 6 x 365 = 21.90 kWh anuales. Con el precio medio actual 0.1090 €/kWh: 21.90 kWh x 0.1090 €/kWh = 2.3871€. Esto motiva que optemos por el Cuasi-Criterio. Con no preferencia en todas las diferencias menores que Q = 10W.
Resolución: Aquí queremos que haya dominancia absoluta en aquellos valores que superen a otros por 720 px, de esta forma establecemos niveles bien diferenciados según la resolución. Preferencia lineal
Densidad: Para la densidad de píxeles vamos a emplear el criterio usual, queremos que cualquier diferencia positiva resulte en preferencia absoluta. Si tuviéramos monitores con densidad de píxeles por encima de 150 elegiríamos un criterio que nos permitiera diferenciar que a partir de esa cantidad apenas existe diferencia.
Brillo: Para el brillo vamos a optar por dar preferencia a monitores con más de 100 nits de diferencia. Preferencia lineal.
Colores: En el caso de los colores vamos a tratar de diferenciar aquellos con 16.7 millones de colores de aquellos que tienen +1000 millones de colores. Así cuando la diferencia sea menor de 100 (M) diremos que no hay preferencia. Cuasi-criterio.
Tamaño: En cuanto al tamaño, queremos que monitores de tamaños muy similares no tengan dominancia entre si y que cualquier salto de tamaño medio nos proporcione dominancia absoluta. Para ello P = 4” y Q = 2”. Función elegida lineal con área de indiferencia.
Frecuencia: La frecuencia de refresco sigue una escala particular, normalmente saltos de 30 Hz se hacen notar bastante hasta cierta cantidad de Hz que los saltos deben ser mayores para que se note. Como para el arquitecto es un factor secundario, vamos a tomar que diferencias menores a 20 Hz no supondrán preferencia de una alternativa sobre otra y que saltos de 59 Hz si harán que escojamos una alternativa con preferencia absoluta. Para los valores intermedios queremos un reparto suavizado, vamos a tomar S = 60 Hz
Creamos la matriz de preferencia con estos valores.
tabla_preferencia <- matrix(c(2,50,0,0,
2,10,0,0,
3,0,720,0,
1,0,0,0,
3,0,100,0,
2,100,0,0,
5,2,4,0,
6,60,20,60),
ncol = 4,
byrow = TRUE)PROMETHEE I
Índices
Vamos a utilizar la función de clase para este método, después se van a analizar los resultados. En primer lugar vamos a mostrar la tabla de índices, esta tabla nos indica en que grado se prefiere una alternativa frente a la otra por filas. Cuanto más cercano sea este valor a uno más fuerte será la preferencia global de la alternativa en la fila frente a la alternativa en la columna.
resultado_Promethee_I <- multicriterio.metodo.promethee_i_med(matriz_decisión,
criterios_subcriterios,
tabla_preferencia)
data.frame(resultado_Promethee_I$tabla.indices,
check.names = FALSE) |> crea_tabla_estilo_comparación()| LG UltraFine 40WT95UF | Asus TUF Gaming VG27AQ3A | MSI MAG401QR | Asus VZ27EHF | Samsung UJ59 | |
|---|---|---|---|---|---|
| LG UltraFine 40WT95UF | 0.00000000 | 0.85833393 | 0.55225991 | 0.8621026 | 0.27333496 |
| Asus TUF Gaming VG27AQ3A | 0.08737954 | 0.00000000 | 0.26004127 | 0.4051801 | 0.06030054 |
| MSI MAG401QR | 0.07085030 | 0.32441353 | 0.00000000 | 0.7124489 | 0.29572238 |
| Asus VZ27EHF | 0.07192743 | 0.07192743 | 0.07192743 | 0.0000000 | 0.08582373 |
| Samsung UJ59 | 0.05993952 | 0.82899072 | 0.59385993 | 0.8289907 | 0.00000000 |
Flujos entrante y saliente
Vamos a mostrar una tabla que recoge los valores para el flujo entrante y saliente de cada alternativa, se emplean para crear el orden parcial de las alternativas. Los casos en los que una alternativa supera a otra para estos flujos se ha visto en clase. En el siguiente apartado mostramos una tabla que usando estos valores nos indica la dominancia.
tabla_flujos <- data.frame(Alternativa = names(ponderaciones_final),
`Flujo entrante` = resultado_Promethee_I$vflujos.ent,
`Flujo saliente` = resultado_Promethee_I$vflujos.sal,
check.names = FALSE)
crea_tabla_estilo(tabla_flujos, nombresfila = FALSE)| Alternativa | Flujo entrante | Flujo saliente |
|---|---|---|
| LG UltraFine 40WT95UF | 0.63650786 | 0.0725242 |
| Asus TUF Gaming VG27AQ3A | 0.20322537 | 0.5209164 |
| MSI MAG401QR | 0.35085877 | 0.3695221 |
| Asus VZ27EHF | 0.07540151 | 0.7021806 |
| Samsung UJ59 | 0.57794522 | 0.1787954 |
Resultado
A continuación, vamos a mostrar una tabla que muestra que alternativas dominan a otras. La alternativa que a más alternativas domine y menos dominada sea será la preferida. Además se añade un grafo que ilustra el resultado de esta tabla, facilitando la interpretación e identificación de las mejores alternativas.
crea_tabla_estilo_comparación(data.frame(resultado_Promethee_I$tablarelacionsupera,
check.names = FALSE))| LG UltraFine 40WT95UF | Asus TUF Gaming VG27AQ3A | MSI MAG401QR | Asus VZ27EHF | Samsung UJ59 | |
|---|---|---|---|---|---|
| LG UltraFine 40WT95UF | 0 | 1 | 1 | 1 | 1 |
| Asus TUF Gaming VG27AQ3A | 0 | 0 | 0 | 1 | 0 |
| MSI MAG401QR | 0 | 1 | 0 | 1 | 0 |
| Asus VZ27EHF | 0 | 0 | 0 | 0 | 0 |
| Samsung UJ59 | 0 | 1 | 1 | 1 | 0 |
construir_grafo_animado(resultado_Promethee_I$tablarelacionsupera, plantilla = "circle")Recordamos que alternativa correspondía a cada modelo
| Modelo | Alternativa número |
|---|---|
| LG UltraFine 40WT95UF | 1 |
| Asus TUF Gaming VG27AQ3A | 2 |
| MSI MAG401QR | 3 |
| Asus VZ27EHF | 4 |
| Samsung UJ59 | 5 |
PROMETHEE II
Índices
Para este método vamos a ultilizar dos funciones diferentes, una que imita la salida del software visual PROMETHEE y otra que nos da los resultados de forma similar al utilizado en el método anterior. En primer lugar vamos a mostrar el escenario que hemos planteado con la salida tipo visual PROMETHEE tras hacer uso de ambas funciones para guardar los resultados.
resultado_Promethee_II <- multicriterio.metodo.promethee_ii_med(matriz_decisión, criterios_subcriterios, tabla_preferencia)
resultado_Promethee_II_Win <- multicriterio.metodo.promethee_windows(matriz_decisión, tabla_preferencia, criterios_subcriterios, c(rep("min",2),rep("max",6)))
tablas_resultado_Promethee_II_Win <- multicriterio.metodo.promethee_windows_kableExtra_html(resultado_Promethee_II_Win)
tablas_resultado_Promethee_II_Win$tabEscenario| Criterio1 | Criterio2 | Criterio3 | Criterio4 | Criterio5 | Criterio6 | Criterio7 | Criterio8 | |
|---|---|---|---|---|---|---|---|---|
| Preferencias | ||||||||
| Min/Max | min | min | max | max | max | max | max | max |
| Pesos | 0.0599395249018804 | 0.0119879049803761 | 0.339617051476852 | 0.194303352071175 | 0.0366790139892087 | 0.0785185870940899 | 0.209215924114814 | 0.0697386413716046 |
| Funciones Preferencias | U-shape (2) | U-shape (2) | V-shape (3) | Usual (1) | V-shape (3) | U-shape (2) | Linear (5) | Gaussian (6) |
| Q: Indiferencia | 50 | 10 | 0 | 0 | 0 | 100 | 2 | 60 |
| P: Preferencia | 0 | 0 | 720 | 0 | 100 | 0 | 4 | 20 |
| S: Gausiano | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 60 |
| Estadísticas | ||||||||
| Minimo | 108 | 21 | 1080 | 81 | 250 | 16.7 | 27 | 60 |
| Maximo | 505 | 40 | 2160 | 139 | 450 | 1070 | 40 | 180 |
| Media | 319.2 | 34.4 | 1656 | 112 | 324 | 632.68 | 33.04 | 123 |
| Desviacion Tipica | 143.17 | 6.92 | 432 | 23.65 | 84.29 | 503.52 | 5.8 | 41.9 |
| Evaluaciones | ||||||||
| LG UltraFine 40WT95UF | 505 | 40 | 2160 | 139 | 450 | 1060 | 39.7 | 120 |
| Asus TUF Gaming VG27AQ3A | 244 | 35 | 1440 | 108 | 250 | 16.7 | 27 | 180 |
| MSI MAG401QR | 449 | 39 | 1440 | 93 | 400 | 1070 | 40 | 155 |
| Asus VZ27EHF | 108 | 21 | 1080 | 81 | 250 | 16.7 | 27 | 100 |
| Samsung UJ59 | 290 | 37 | 2160 | 139 | 270 | 1000 | 31.5 | 60 |
Esta tabla nos muestra tres bloques, el primer bloque de preferencias nos muestra un resumen de los parámetros que hemos establecido en el enunciado. El segundo bloque, estadísticas, nos da un resumen descriptivo de las evaluaciones. Dichas evaluaciones se encuentran en el tercer bloque.
Resultado
Ahora vamos a mostrar la tabla de flujos netos, que es la diferencia entre los flujos entrantes y salientes que veíamos en el resultado anterior. Vamos a mostrar dos tablas distintas que representan lo mismo, cada una para los resultados ofrecidos por las distintas funciones. Como para el desarrollo del problema con funciones de clase hemos empleado aquellas que normalizan los flujos, el resultado obtenido es el mismo, de no haberlas normalizado podríamos obtener valores distintos para los flujos.
Tabla resultado funciones_win
tablas_resultado_Promethee_II_Win$tabAcciones| Rango | Phi | Phi.mas | Phi.menos | |
|---|---|---|---|---|
| LG UltraFine 40WT95UF | 1 | 0.5640 | 0.6365 | 0.0725 |
| Samsung UJ59 | 2 | 0.3991 | 0.5779 | 0.1788 |
| MSI MAG401QR | 3 | -0.0187 | 0.3509 | 0.3695 |
| Asus TUF Gaming VG27AQ3A | 4 | -0.3177 | 0.2032 | 0.5209 |
| Asus VZ27EHF | 5 | -0.6268 | 0.0754 | 0.7022 |
Tabla resultado funciones_clase
tabla_flujos_netos <- data.frame(Alternativa = names(ponderaciones_final),
`Flujo neto` = resultado_Promethee_II$vflujos.netos,
check.names = FALSE)
crea_tabla_estilo(tabla_flujos_netos, nombresfila = FALSE)| Alternativa | Flujo neto |
|---|---|
| LG UltraFine 40WT95UF | 0.56398366 |
| Asus TUF Gaming VG27AQ3A | -0.31769103 |
| MSI MAG401QR | -0.01866337 |
| Asus VZ27EHF | -0.62677907 |
| Samsung UJ59 | 0.39914982 |
Además para el resultado, también añadimos un grafo que nos ayuda a identificar las dominancias entre alternativas junto a los flujos netos.
construir_grafo_animado(resultado_Promethee_II$tablarelacionsupera, plantilla = "circle")Recordamos que alternativa correspondía a cada modelo
| Modelo | Alternativa número |
|---|---|
| LG UltraFine 40WT95UF | 1 |
| Asus TUF Gaming VG27AQ3A | 2 |
| MSI MAG401QR | 3 |
| Asus VZ27EHF | 4 |
| Samsung UJ59 | 5 |
Conclusión
Podemos comprobar que la mejor alternativa bajo los pesos establecidos para el problema y empleando este método es el modelo “LG UltraFine 40WT95UF”. Seguido del modelo “Samsung UJ59” y como tercera opción el “MSI MAG401QR”. En promethee I no hemos tenido el caso de que dos alternativas (o más) fueran incomparables por lo que esta conclusión es apta para ambos, PROMETHEE I y II. Se recomienda entonces al arquitecto adquirir el modelo “LG UltraFine 40WT95UF”.
Planteamiento para Arrow y Raymond
Este método no emplea pesos, compara todas las alternativas entre ellas para cada criterio y hace una tabla que acumula cantidad de criterios en los que una alternativa (fila) supera a las demás (columnas).
Además se puede realizar un análisis de sensibilidad, multiplicando la primera alternativa (en este caso) por un valor \(\alpha\) mayor o igual a uno que mejora los valores de esa alternativa progresivamente. De esta forma podemos observar como su variación afecta al orden final.
Vamos a hacer el análisis de sensibilidad a la vez que aplicamos el método y el resultado para el método será la primera iteración del análisis con \(\alpha\) = 1, que no modifica la alternativa.
Desarrollo
Vamos a mostrar la matriz de superaciones en las iteraciones primera y última del método, recordemos que este método va reduciendo las alternativas a medida que itera. Quedando en el último paso la alternativa preferida.
intalpha <- seq(1,2,0.1)
sols <- vector("list", length(intalpha))
sols_pasos <- vector("list", length(intalpha))
for (i in 1:length(intalpha)) {
Mat_i <- matriz_decisión
Mat_i[4,] <- Mat_i[4,] * intalpha[i]
sol_ArrowRaymond_i <- multicriterio.metodoaxiomatico.ArrowRaymond(Mat_i)
sols[[i]] <- sol_ArrowRaymond_i$alternativasordenadas
sols_pasos[[i]] <- sol_ArrowRaymond_i$pasos
}Aquí vemos la tabla para la primera iteración:
data.frame(sols_pasos[[1]][[1]]$Mclasificacion,
check.names = FALSE) |> crea_tabla_estilo_comparación()| LG UltraFine 40WT95UF | Asus TUF Gaming VG27AQ3A | MSI MAG401QR | Asus VZ27EHF | Samsung UJ59 | |
|---|---|---|---|---|---|
| LG UltraFine 40WT95UF | NA | 5.0 | 3.0 | 6.0 | 5 |
| Asus TUF Gaming VG27AQ3A | 3 | NA | 4.5 | 4.5 | 3 |
| MSI MAG401QR | 5 | 3.5 | NA | 6.0 | 4 |
| Asus VZ27EHF | 2 | 3.5 | 2.0 | NA | 3 |
| Samsung UJ59 | 3 | 5.0 | 4.0 | 5.0 | NA |
Ahora mostramos la tabla de la última iteración
data.frame(sols_pasos[[1]][[4]]$Mclasificacion,
check.names = FALSE) |> crea_tabla_estilo_comparación()| LG UltraFine 40WT95UF | MSI MAG401QR | |
|---|---|---|
| LG UltraFine 40WT95UF | NA | 3 |
| MSI MAG401QR | 5 | NA |
En esta tabla ya se puede observar el resultado del método, pero vamos a visualizarla de más formas.
Análisis de sensibilidad
Para el análisis de sensibilidad vamos a mostrar el gráfico que muestra la evolución de la cuarta alternativa según aumenta \(\alpha\). Se ha escogido esta alternativa por ser la peor inicialmente.
observar_posiciones <- function(valfas, alter, solu){
posiciones = rep(NA,length(valfas))
for (i in 1:length(valfas)) {
#i = 1
posiciones[i] = which(solu[[i]]==alter)
}
return(posiciones)
}
lista_ArrowRaymond <- lapply(names(ponderaciones_final), observar_posiciones, valfas=intalpha, solu=sols)Recordemos que las primeras posiciones que se visualizan (\(\alpha\) = 1) representan el resultado del método.
dataframe_ArrowRaymon <- lista_ArrowRaymond |>
purrr::imap_dfr(~ tibble(
alpha = intalpha,
posicion = .x,
alternativa = paste0("a", .y)
))
ggplot(dataframe_ArrowRaymon, aes(x = alpha, y = posicion, color = alternativa)) +
geom_line(linewidth = 1.2) +
geom_point(size = 2) +
scale_color_manual(values = c("#005682", "#C3625B", "#7FBFF5", "#F8A29E", "#111111")) +
labs(
title = "Evolución de posiciones por alternativa",
x = expression(alpha),
y = "Posición"
) +
theme_minimal(base_size = 14) +
theme(
legend.title = element_blank(),
legend.position = "top",
plot.title = element_text(face = "bold", hjust = 0.5),
panel.grid.minor = element_blank()
)En el gráfico podemos ver claramente como se ordenan las alternativas en este método, en cuanto a la sensibilidad podemos decir que las mejores opciones sostienen su posición frente a incrementos de hasta el 40% en la peor alternativa. Sin embargo, incrementos pequeños hacen que las alternativas en tercera y cuarta posición sean adelantadas rápidamente. Por ello, el resultado en nuestro caso es sensible a cambios en las evaluaciones de las alternativas o la inclusión de otras alternativas.
Conclusiones
Este método nos indicaría que la mejor alternativa es el monitor “MSI MAG401QR” y la segunda mejor, el monitor, “LG UltraFine 40WT95UF”. Con este método recomendaríamos al arquitecto optar por la mejor alternativa, “MSI MAG401QR”. Pero como veremos a continuación no lo consideraremos el mejor método para tomar la decisión.
Conclusión final
Comparación de los métodos
Para comparar los métodos, en primer lugar se va a adjuntar una tabla resumen con los resultados obtenidos para cada método.
data.frame(Método = c("AHP", "ELECTRE", "PROMETHEE", "Arrow y Raymond"),
`Mejor alternativa` = c(rep(names(ponderaciones_final)[1], 3),
names(ponderaciones_final)[3]),
`Segunda alternativa` = c(names(ponderaciones_final)[5],
names(ponderaciones_final)[3],
names(ponderaciones_final)[5],
names(ponderaciones_final)[1]),
check.names = FALSE) |> crea_tabla_estilo(nombresfila = FALSE)| Método | Mejor alternativa | Segunda alternativa |
|---|---|---|
| AHP | LG UltraFine 40WT95UF | Samsung UJ59 |
| ELECTRE | LG UltraFine 40WT95UF | MSI MAG401QR |
| PROMETHEE | LG UltraFine 40WT95UF | Samsung UJ59 |
| Arrow y Raymond | MSI MAG401QR | LG UltraFine 40WT95UF |
Así, podemos comprobar lo que se ha comentado a lo largo del desarrollo de los métodos, aquellos que nos dejan controlar mejor lo que se valora y como se valora dan un resultado más acorde a los pesos de los criterios y las valoraciones de las alternativas (AHP y PROMETHEE). Por otra parte los métodos axiomático de Arrow y Raymond junto al ELECTRE son más rígidos en este aspecto y cualquier diferencia entre las evaluaciones tiene un impacto final en su resultado. En el caso particular del método ELECTRE nos permite algo de holgura pero al ser post evaluación de los criterios solo nos habilita “quitar” dominancias. Por su parte, la ausencia de pesos en el Axiomático de Arrow y Raymond provoca que solo lo recomendemos para casos de igualdad de pesos entre los criterios, cuando cualquier diferencia entre ellos ya es significativa, o para apoyarnos en la comparación de las alternativas en bruto, antes de emplear otros métodos.
Finalmente podemos destacar los métodos AHP y PROMETHEE como los más versátiles en casos como este, para comparar artículos con características medibles como vehículos, viviendas o productos tecnológicos entre otros. No se debe olvidar que una mayor flexibilidad también provoca que podamos manipularlo, para obtener resultados que, de forma subjetiva, nos hayan convencido más antes de iniciar el proceso de decisión. Por tanto apoyarnos en otros métodos más rígidos o ser lo más objetivo posible es indispensable.
Decisión final
Viendo los resultados obtenidos para todos los métodos se va a optar por el modelo “LG UltraFine 40WT95UF” dado que aparece como la alternativa dominante en tres de los cuatro métodos y en el único que no aparece como mejor alternativa, se mantiene como el segundo mejor.